package priv.pattern.singleton;

// 饿汉式单例模式
// 类加载时，立即创建对象，不管是否需要，都创建对象
// 优点：线程安全，延迟加载，占用内存小
// 缺点：占用内存，浪费资源
class SingletonA {
    private static final SingletonA INSTANCE = new SingletonA();

    public SingletonA getInstance() {
        return INSTANCE;
    }
}

// 懒汉式单例模式
// 类加载时，不创建对象，直到第一次调用 getInstance() 方法时才创建对象
// 优点：节省资源，延迟加载
// 缺点：线程不安全，可能出现多个实例
class SingletonB {
    private static SingletonB instance = null;

    public static SingletonB getInstance() {
        if (instance == null) {
            instance = new SingletonB();
        }
        return instance;
    }
}

// 线程安全的懒汉式单例模式
// 类加载时，不创建对象，直到第一次调用 getInstance() 方法时才创建对象
// 利用静态内部类的特性实现线程安全
class SingletonC {
    private SingletonC() {
    }

    // 静态内部类
    // 使用 SingletonC 类时，如果没有调用 SingletonCHolder 相关的操作
    // 那么 SingletonCHolder 类不会被加载，也就不会创建 SingletonC 实例
    // 保证了线程安全，也符合懒汉式单例模式的特点
    private static class SingletonCHolder {
        private static final SingletonC INSTANCE = new SingletonC();
    }

    public static SingletonC getInstance() {
        return SingletonCHolder.INSTANCE;
    }
}